package com.yycx.dbr.boot.admin.test.thread;

import com.yycx.module.admin.client.entity.BaseUser;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutionException;

/**
 * @author 汪兴安
 * 应用场景 ：1.每个线程耗时差别大，谁先完成，谁返回
 * 对顺序没有要求。
 * <p>
 * <p>
 * <p>
 * CompletionService 的性能更高。
 * 考虑如下场景：多线程下载，结果用Future返回。
 * 第一个文件特别大，后面的文件很小。
 * 用方法1，能很快知道已经下载完文件的结果(不是第一个)；
 */
public class CallableAndFuture {

    public static void main(String[] args) {
        List<BaseUser> totalList = new ArrayList();

        ExecutorService threadPool = Executors.newCachedThreadPool();
        CompletionService<List<BaseUser>> cs = new ExecutorCompletionService (threadPool);
        for (int i = 0; i < 6; i++) {
            cs.submit(new DemoThread(i));
        }
        // 可能做一些事情
        for (int i = 0; i < 6; i++) {
            try {
                totalList.addAll(cs.take().get());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }

        //得到分页后结果总共集合
        for (int i = 0; i < totalList.size(); i++) {
            System.out.println(totalList.get(i).getUserName());
        }
    }

}
